﻿var mk = new mKook();
function mKook() {
    var $this = this;

    $this.guid = "37A1DB2E0CD5435F89E55CAC71FFC5F3";
    $this.host = "http://pc0132547.danfoss.net/ExtDS/jCRM.asmx";
    //$this.service = "http://localhost/ExtDS/jCRM.asmx";
    //Последний запрос
    $this.lastRequest = null;
    //
    $this.uiManager = null;
    //Текущая база данных
    $this.init = function () {
        //База данных
        $this.db = new DBManager();
        //Менеджер интерфейса
        $this.uiManager = new UIManager();
        //Текущая модель представления
        $this.viewModel = null;
        //Открываем базу данных
        $this.db.dbOpen('crmDB');
        //Определение таблицы запросов для dbManager
        var tblRequest = [{ col: 'id', type: 'INTEGER PRIMARY KEY AUTOINCREMENT' }, { col: 'time', type: 'TEXT' }, { col: 'stat', type: 'TEXT' },
        { col: 'name', type: 'TEXT' }, { col: 'key', type: 'TEXT' }, { col: 'data', type: 'TEXT'}];
        //Создаем таблицу запросов, если ее нет
        $this.db.tbCreate('tbl_request', tblRequest, function () { log.error('Create table'); });
    }
    //Выполнить запрос
    $this.doRequest = function (req) {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="req"></param>
        // Найти запрос в базе
        $this.selectRequest(req,
        //Если запрос найден, то считать его
            function (result) {
                //Считать запрос из первой строки
                $this.readRequest(req, result);
                //Запустить запрос
                $this.runRequest(req);
            },
        //Если запрос не найден, то записать его в таблицу
            function (result) {
                //Время запроса
                req.time = $this.getTime();
                //Вставить запрос
                $this.insertRequest(req,
                //Если запрос вставлен удачно
                    function () {
                        //Запустить запрос
                        $this.runRequest(req);
                    },
                //Если не удалось вставить запрос, то сообщить об этом
                    function (error) {
                        log.error(error);
                    }
                );
            },
        //Если ошибка при чтении запроса то сообщить об этом
            function (error) {
                log.error(error);
            },
        //Если система не поддерживает базу данных просто запустить запрос
            function () {
                $this.runRequest(req);
            }
        );
    };
    //Запустить запрос
    $this.runRequest = function (req) {
        //Если запрос является "локальным", то просто загрузить модель
        if (req.stat == "local" || req.stat == "ok") {
            $this.runModel(req);
        }
        //Если запрос с ошибкой или неопределен, то отправить запрос на сервер
        else if (req.stat === "error" || req.stat == "undefined" || req.stat == "" || req.stat == "server") {
            //Отправить запрос на сервер
            $this.sendRequest(req);
        }
    }
    //Запускаем модель
    $this.runModel = function (req) {
        //Текущая модель представления
        $this.viewModel = new (eval('vm' + req.name))(req.data);
        //Загрузить шаблон
        $this.uiManager.loadModelTemplate('tmpl' + req.name, function () {
            //Привязываем текущую модель к документу HTML
            $this.uiManager.applyBindings($this.viewModel);
            // Создаем JQM стиль
            $this.uiManager.refreshUI();
        });

    }
    //Послать запрос на сервер (Веб-сервис) и получить ответ
    $this.sendRequest = function (req, fn_success, fn_error) {
        //Ссылка на mKook для обращения через callback функцию асинхронного вызова
        //URL адрес сервиса
        var host = (req.host) ? req.host : $this.host;
        var guid = (req.guid) ? req.guid : $this.guid;
        //Ключ запроса (параметры)
        var key = $this.getKey();
        key.guid = guid;

        $.getJSON(host + '/' + req.name + '?jsoncallback=?', key, function (data, status) {
            if (status == 'success') {
                $this.setRequest(req, data);
                $this.runModel(req);
            }
            else {
                log.error('Send error:' + JSON.stringify(error));
            }
        });
    }
    //Обновить данные запроса по
    $this.setRequest = function (req, data) {
        //Имя запроса
        req.name = data.name;
        //Время на момент прибытия ответа
        req.time = $this.getTime();
        //Статус запроса
        req.stat = data.stat;
        var data = $.parseJSON(data.data);
        if (req.stat == 'ok') {
            req.data = data;
        }
        else if (req.stat == 'update') {
            for (var key in data) {
                req.data[key] = data[key];
            }
        }
        else if (req.stat == 'error') {
            req.data.error = data.error;
        }
        else {
            log.error([req, data]);
        }
    }
    //Считать запрос с записи таблицы
    $this.readRequest = function (req, result) {
        //Записываем запрос
        var row = result.rows.item(0);
        req.id = row.id;
        req.time = row.time;
        req.stat = row.stat;
        req.name = row.name;
        req.key = JSON.parse(row.key);
        req.data = JSON.parse(row.data);
    }
    //Добавить запрос в таблицу
    $this.insertRequest = function (req, fn_success, fn_error) {
        var arrInsertQuery = [
        { col: 'time', val: "'" + req.time + "'" },
        { col: 'stat', val: "'" + req.stat + "'" },
        { col: 'name', val: "'" + req.name + "'" },
        { col: 'key', val: "'" + JSON.stringify(req.key) + "'" },
        { col: 'data', val: "'" + JSON.stringify(req.data) + "'"}];
        $this.db.tbInsert('tbl_request', arrInsertQuery, fn_success, fn_error);
    }
    //Найти запрос
    $this.selectRequest = function (req, fn_finded, fn_not_finded, fn_error, fn_dbnull) {
        if (req.name && req.key) {
            arrSelectQuery = [{ col: 'name', val: req.name }, { col: 'key', val: JSON.stringify(req.key)}];
        }
        else if (req.id > 0) {
            arrSelectQuery = [{ col: 'id', val: req.id}];
        }
        $this.db.tbSelect('tbl_request', arrSelectQuery, fn_finded, fn_not_finded, fn_error, fn_dbnull);
    }
    //Обновить запрос
    $this.updateRequest = function (req) {
        $this.db.tbUpdate('tbl_request',
        [{ col: "id", val: req.id}],
        [{ col: 'data', val: "'" + JSON.stringify(req.data) + "'"}],
        //Запрос обновлен
            function (t, result) {

            },
        //Ошибка, при обновлении запроса
            function (t, error) {
                log.error(error);
            }
        );
    }
    //Формирования ключа в виде строки
    $this.getKey = function () {
        var key = new Object();
        if ($this.viewModel.key.length > 0) {
            for (var i = 0; i < $this.viewModel.key.length; i++) {
                var name = $this.viewModel.key[i];
                var value = $this.viewModel.model[name]();
                key[name] = value;
            }
        }
        return key;
    }
    //Формирование данных
    $this.getData = function () {
        strData = JSON.stringify($this.viewModel.data);
        return strData;
    }
    //Формирования даты
    $this.getTime = function () {
        var date = new Date();
        var day = date.getDate();
        var month = date.getMonth() + 1;
        var year = date.getFullYear();
        return day + "." + month + "." + year;
    }
}